10. Пример - Расписание

Создать школьное расписание с разделением по дням недели, где пользователь сможет:

  • Добавлять уроки по дням недели (с указанием времени, предмета и учителя).
  • Удалять конкретные уроки из таблицы расписания.
  • Очищать расписание для конкретного дня или для всех дней сразу.
  • Сохранять данные расписания в localStorage, чтобы они не терялись при перезагрузке страницы.

Шаги разработки


1. Создание HTML файла

Что нужно сделать:

  1. Создайте файл index.html.
  2. Добавьте базовую структуру документа.
  3. Добавьте элементы формы для добавления урока и кнопки для управления расписанием.

Код:

<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Школьное расписание по дням</title>
    <link rel="stylesheet" href="styles.css"> <!-- Подключаем стили -->
</head>
<body>

<h1>Школьное расписание</h1>

<!-- Выбор дня недели -->
<select id="day-select">
    <option value="Понедельник">Понедельник</option>
    <option value="Вторник">Вторник</option>
    <option value="Среда">Среда</option>
    <option value="Четверг">Четверг</option>
    <option value="Пятница">Пятница</option>
</select>

<!-- Форма для добавления уроков -->
<form id="schedule-form">
    <input type="text" id="time" placeholder="Время (например, 08:00 - 08:45)" required>
    <input type="text" id="subject" placeholder="Предмет" required>
    <input type="text" id="teacher" placeholder="Учитель" required>
    <button type="submit">Добавить урок</button>
</form>

<button id="clear-all-button">Очистить все расписание</button>

<!-- Таблицы расписания для каждого дня недели -->
<div id="schedules">
    <h2>Понедельник</h2>
    <table class="schedule-table" data-day="Понедельник">
        <thead>
            <tr>
                <th>Время</th>
                <th>Предмет</th>
                <th>Учитель</th>
                <th>Действия</th>
            </tr>
        </thead>
        <tbody></tbody>
    </table>

    <!-- Повторяем таблицы для каждого дня недели -->
    <h2>Вторник</h2>
    <table class="schedule-table" data-day="Вторник">
        <thead>
            <tr>
                <th>Время</th>
                <th>Предмет</th>
                <th>Учитель</th>
                <th>Действия</th>
            </tr>
        </thead>
        <tbody></tbody>
    </table>

    <!-- Аналогичные таблицы для остальных дней недели -->
</div>

<script src="script.js"></script> <!-- Подключаем файл скриптов -->
</body>
</html>

Объяснение ключевых элементов HTML

  • <select> — используется для выбора дня недели, к которому будет добавлен урок.
  • Форма <form> — содержит поля для ввода времени, предмета и учителя.
  • Кнопка "Очистить все расписание" — очищает все данные из всех таблиц и localStorage.
  • Таблицы для каждого дня недели — каждая таблица привязана к определённому дню недели через атрибут data-day.

2. Стилизация страницы с помощью CSS

Что нужно сделать:

  1. Создайте файл styles.css.
  2. Вставьте следующий код:

Код:

body {
    font-family: Arial, sans-serif;
    background-color: #f4f4f9;
    color: #333;
    text-align: center;
    padding: 20px;
}

h1, h2 {
    margin-bottom: 20px;
}

form {
    margin-bottom: 20px;
}

input[type="text"] {
    padding: 10px;
    margin-right: 10px;
    border: 1px solid #ccc;
    border-radius: 4px;
}

button {
    padding: 10px 20px;
    background-color: #009879;
    color: white;
    border: none;
    border-radius: 4px;
    cursor: pointer;
}

button:hover {
    background-color: #007960;
}

table {
    width: 100%;
    border-collapse: collapse;
    margin-top: 20px;
}

th, td {
    padding: 12px;
    border: 1px solid #ddd;
    text-align: center;
}

tr:nth-child(even) {
    background-color: #f3f3f3;
}

3. Логика JavaScript

Что нужно сделать:

  1. Создайте файл script.js.
  2. Вставьте следующий код:

Основной функционал

const form = document.getElementById('schedule-form');
const daySelect = document.getElementById('day-select');
const timeInput = document.getElementById('time');
const subjectInput = document.getElementById('subject');
const teacherInput = document.getElementById('teacher');
const clearAllButton = document.getElementById('clear-all-button');
const schedules = document.querySelectorAll('.schedule-table');

document.addEventListener('DOMContentLoaded', loadData);
form.addEventListener('submit', addLesson);
clearAllButton.addEventListener('click', clearAllSchedules);

function loadData() {
    schedules.forEach(schedule => {
        const day = schedule.getAttribute('data-day');
        const data = JSON.parse(localStorage.getItem(day)) || [];
        data.forEach(lesson => addRowToTable(schedule, lesson.time, lesson.subject, lesson.teacher));
    });
}

function addLesson(event) {
    event.preventDefault();
    const day = daySelect.value;
    const time = timeInput.value;
    const subject = subjectInput.value;
    const teacher = teacherInput.value;

    const scheduleTable = document.querySelector(`table[data-day="${day}"] tbody`);
    addRowToTable(scheduleTable, time, subject, teacher);
    saveData(day, time, subject, teacher);
    form.reset();
}

function addRowToTable(schedule, time, subject, teacher) {
    const row = document.createElement('tr');
    row.innerHTML = `
        <td>${time}</td>
        <td>${subject}</td>
        <td>${teacher}</td>
        <td><button class="delete">Удалить</button></td>
    `;
    schedule.appendChild(row);

    row.querySelector('.delete').addEventListener('click', function() {
        row.remove();
        deleteData(schedule.getAttribute('data-day'), time, subject, teacher);
    });
}

function saveData(day, time, subject, teacher) {
    const data = JSON.parse(localStorage.getItem(day)) || [];
    data.push({ time, subject, teacher });
    localStorage.setItem(day, JSON.stringify(data));
}

function deleteData(day, time, subject, teacher) {
    let data = JSON.parse(localStorage.getItem(day)) || [];
    data = data.filter(lesson => lesson.time !== time || lesson.subject !== subject || lesson.teacher !== teacher);
    localStorage.setItem(day, JSON.stringify(data));
}

function clearAllSchedules() {
    schedules.forEach(schedule => schedule.querySelector('tbody').innerHTML = '');
    localStorage.clear();
}

Функциональность

  1. loadData — загружает данные из localStorage для каждого дня.
  2. addLesson — добавляет урок и сохраняет его в localStorage.
  3. addRowToTable — добавляет урок в HTML-таблицу.
  4. saveData — сохраняет урок в localStorage.
  5. deleteData — удаляет урок из localStorage.
  6. clearAllSchedules — очищает все таблицы и localStorage.